//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include <Inifiles.hpp>
#include <Registry.hpp>
#include "uSelPrt.h"
#include "uParmPrt.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
#define MODULE_TAG 1201
//---------------------------------------------------------------------------
bool __fastcall SelectQuickPrinter( const AnsiString &strFileName, AnsiString &strConstructeur, AnsiString &strImprimante, AnsiString &strPort,
                                    PAPER_HEIGHT &ePaperH, PAPER_STYLE &ePaperS)
{
  TfrmSelectPrinter *frmSelectPrinter = NULL;
  bool               bReturn          = false;
  try {
    frmSelectPrinter = new TfrmSelectPrinter( strFileName);
    // Sélectionne l'imprimante par défaut
    TTreeNodes *pTreeNodes = frmSelectPrinter->tvPrinters->Items; ASSERT( pTreeNodes);
    for( int i=0; i</*pTreeNodes->Count*/( int)TreeView_GetCount( frmSelectPrinter->tvPrinters->Handle); i++) {
      TTreeNode *pNode = pTreeNodes->Item[i];
      if (( pNode->Text==strConstructeur) && (pNode->Level==0)) {
        for( int j=0; j<pNode->Count; j++)
          if ( pNode->Item[j]->Text==strImprimante) frmSelectPrinter->tvPrinters->Selected = pNode->Item[j];
        break;
    } }
    if ( !frmSelectPrinter->tvPrinters->Selected && (frmSelectPrinter->tvPrinters->Items->Count!=0))
          frmSelectPrinter->tvPrinters->Selected = frmSelectPrinter->tvPrinters->Items->Item[0];
    // Sélectionne le port par défaut
    if ( ::SendMessage( frmSelectPrinter->lbPorts->Handle, LB_SELECTSTRING, -1, (LPARAM)(LPCTSTR)strPort.c_str())==LB_ERR)
         frmSelectPrinter->lbPorts->ItemIndex = 0;
    if ( frmSelectPrinter->lbPorts->Items->Count) frmSelectPrinter->lbPortsClick( frmSelectPrinter->lbPorts);
                                           else   frmSelectPrinter->lblPort->Caption = EmptyStr;
    // Sélectionne les paramètres du papier par défaut
    ASSERT(( ePaperH==PH_10INCH) || ( ePaperH==PH_12INCH));
    frmSelectPrinter->rbPaper10->Checked = ( ePaperH==PH_10INCH);
    frmSelectPrinter->rbPaper12->Checked = ( ePaperH==PH_12INCH);
    ASSERT(( ePaperS==PS_FRENCH) || ( ePaperS==PS_ITALIA));
    frmSelectPrinter->rbPaperFrench->Checked = ( ePaperS==PS_FRENCH);
    frmSelectPrinter->rbPaperItalia->Checked = ( ePaperS==PS_ITALIA);
    // Affichage la fenêtre de sélection de l'imprimante
    if ( frmSelectPrinter->ShowModal()==mrOk) {
      // L'utilisateur a cliqué sur 'Valider', on sélectionne
      // une nouvelle imprimante rapide par défaut
      ASSERT( frmSelectPrinter->tvPrinters->Selected);
      ASSERT( frmSelectPrinter->tvPrinters->Selected->Parent);
      ASSERT( frmSelectPrinter->tvPrinters->Selected->Level==1);
      strConstructeur = frmSelectPrinter->tvPrinters->Selected->Parent->Text;
      strImprimante   = frmSelectPrinter->tvPrinters->Selected->Text;
      strPort         = frmSelectPrinter->lbPorts->Items->Strings[ frmSelectPrinter->lbPorts->ItemIndex];
      ePaperH         = frmSelectPrinter->rbPaper10    ->Checked ? PH_10INCH : PH_12INCH;
      ePaperS         = frmSelectPrinter->rbPaperFrench->Checked ? PS_FRENCH : PS_ITALIA;
      bReturn         = true;
    }
  } catch ( Exception &e) {
    EICDisplayException( TAG( 5), e);
  }
  delete frmSelectPrinter;
  return bReturn;
}
//---------------------------------------------------------------------------
__fastcall TfrmSelectPrinter::TfrmSelectPrinter( const AnsiString &strFileName, TComponent* Owner /* = NULL */)
    : CForm(Owner)
{
  m_strFileName = strFileName;
  // Voir OnCreate
}
//---------------------------------------------------------------------------
void __fastcall TfrmSelectPrinter::lbStaticEnter(TObject *Sender)
{
  FocusControl( btnValider);
}
//---------------------------------------------------------------------------
void __fastcall TfrmSelectPrinter::tvPrintersChange(TObject *Sender,
      TTreeNode *Node)
{
  ASSERT( Node);

  // Affichage du constructeur et de l'imprimante sélectionné
  switch ( Node->Level) {
    case 0  : lblConstructeur->Caption = Node->Text;
              lblImprimante  ->Caption = EmptyStr;
              btnParam       ->Enabled = false;
              btnValider     ->Enabled = false;
              break;
    case 1  : ASSERT( Node->Parent);
              lblConstructeur->Caption = Node->Parent->Text;
              lblImprimante  ->Caption = Node->Text;
              btnParam       ->Enabled = (lbPorts->Items->Count!=0);
              btnValider     ->Enabled = (lbPorts->Items->Count!=0);
              break;
    default : ASSERT( false);
              btnParam       ->Enabled = false;
              btnValider     ->Enabled = false;
              break;
  }
}
//---------------------------------------------------------------------------
void __fastcall TfrmSelectPrinter::lbPortsClick(TObject *Sender)
{
  lblPort->Caption = lbPorts->Items->Strings[ lbPorts->ItemIndex];
}
//---------------------------------------------------------------------------
void __fastcall TfrmSelectPrinter::btnParamClick(TObject *Sender)
{
  ASSERT( tvPrinters->Selected);
  ASSERT( tvPrinters->Selected->Level==1);
  ASSERT( tvPrinters->Selected->Parent);
  ASSERT( tvPrinters->Selected->Parent->Level==0);
  ParametrerImprimante( &m_btrvPrt, tvPrinters->Selected->Parent->Text, tvPrinters->Selected->Text);
}
//---------------------------------------------------------------------------
void __fastcall TfrmSelectPrinter::tvPrintersDblClick(TObject *Sender)
{
  ASSERT( tvPrinters->Selected);
  //if ( tvPrinters->Selected->Level==1) btnValider->Click();
}
//---------------------------------------------------------------------------
void __fastcall TfrmSelectPrinter::FormCreate(TObject *Sender)
{
  TDefPrinter printer, key;
  TTreeNode  *pNode;
  CBarre      iBarre;

  iBarre.Titre    = "Initialisation de l'impression rapide";
  iBarre.Messages = "Recherche des drivers des imprimantes recencées\nRecherche des ports disponibles";
  iBarre.Open();

  // Affichage de la liste des pilotes d'impression
  // ----------------------------------------------
  tvPrinters->Items->Clear();
  m_btrvPrt.Open( TAG( 10), BTRV_R, sizeof( TDefPrinter), m_strFileName);
  iBarre.Max = m_btrvPrt.NbEnreg + 1;
  m_btrvPrt.GetFirst( TAG( 11), &printer, &key, 0); iBarre++;
  do {
    // Extrait le nom du constructeur et le nom de l'imprimante
    // .. ( nom de l'imprimante = <<constructeur>> + ' ' + <<Modèle>>
    AnsiString strConstructeur;
    AnsiString strImprimante;
    AnsiString strModele      ( printer.szModele);
    ExtractConstructeurPrinter( strModele, strConstructeur, strImprimante);
    // Nom des imprimantes a ne pas inclure
    if (( strModele.Pos( "IMPRESSION DANS UN FICHIER")!=0) ||
        ( strModele.Pos( "** GENERIQUE"              )!=0)) goto lblNoInsert;
    // Recherche si le constructeur existe
    for( int i=0; i<tvPrinters->Items->Count; i++)
      if (( pNode=tvPrinters->Items->Item[i])->Text==strConstructeur) goto lblFind;
    // S'il n'existe pas, celui-ci est insérer
    pNode = tvPrinters->Items->Add( NULL, strConstructeur);
    pNode->ImageIndex    = 1;
    pNode->SelectedIndex = 1;
lblFind:
    // Insert le nom de l'imprimante
    pNode = tvPrinters->Items->AddChild( pNode, strImprimante);
    pNode->ImageIndex    = 0;
    pNode->SelectedIndex = 0;
lblNoInsert:
    iBarre++;
  } while ( m_btrvPrt.GetNext( TAG( 12), &printer, &key, 0));

  // Affichage de la liste des ports disponibles
  // -------------------------------------------
  iBarre.NextMessage();
  switch ( _WINPLATFORM) {
    case VP_WINDOWS_95_98 : { // ** Version Windows 95 et Windows 98 **
                            TIniFile  *pWinIni = new TIniFile( "WIN.INI");
                            TStrings  *pPorts  = new TStringList;
                            // Lit le nom de tous les ports
                            pPorts->Clear();
                            pWinIni->ReadSection( "PORTS", pPorts);
                            // Supprime le port "FILE:" s'il existe
                            iBarre.Max = pPorts->Count;
                            for( int i=pPorts->Count-1; i>=0; i--) {
                              if ( pPorts->Strings[i].Pos( "FILE")!=0) pPorts->Delete( i);
                              iBarre++; ::Sleep( 50);
                            }
                            // Ajoute tous les ports dans la liste
                            lbPorts->Items->Assign( pPorts);
                            // Désallocation de la mémoire
                            delete pPorts; delete pWinIni; }
                            break;
    case VP_WINDOWS_NT    : { // ** Version Windows NT **
                            TRegistry *pRegistry = new TRegistry();
                            TStrings  *pPorts    = new TStringList;
                            // Lit le nom de tous les ports
                            pRegistry->RootKey   = HKEY_LOCAL_MACHINE;
                            pRegistry->Access = KEY_READ;
                            if ( pRegistry->OpenKey( strWinNTKeyPorts, false)) {
                              pRegistry->GetValueNames( pPorts);
                              pRegistry->CloseKey();
                            }
                            // Supprime le port "FILE:" s'il existe
                            iBarre.Max = pPorts->Count;
                            for( int i=pPorts->Count-1; i>=0; i--) {
                              if ( pPorts->Strings[i].Pos( "FILE")!=0) pPorts->Delete( i);
                              iBarre++; ::Sleep( 50);
                            }
                            // Ajoute tous les ports dans la liste
                            lbPorts->Items->Assign( pPorts);
                            delete pPorts; delete pRegistry; }
                            break;
    default               : ASSERT( false); break;
  }
  m_btrvPrt.Close( TAG( 19));
}
//---------------------------------------------------------------------------

